1 Introduction

Four datasets from the World Life Expectancy data - Income per Person, Life Expectancy, Population Size and Country Regions, contain information that potentially impacts the life expectancy of the world. The data covers relative information between 1800 and 2018. All four datasets were combined together into one dataset for this analysis.

The combined dataset contains 40437 observations and 6 variables. The variables are:

  1. country - Name of the country (categorical)
  2. Region - The region the country belongs to (categorical)
  3. Year - Year (categorical)
  4. Income - Income (Numerical) - in constant international dollars.
  5. life expectancy - Number of years (Numerical)
  6. Population Size - Total Population count of a country (Numerical)

A copy of the combined dataset can be found here: https://github.com/chinwex/STA553/raw/main/w05/merged_data.csv

dt <- read.csv(file="https://github.com/chinwex/STA553/raw/main/w05/merged_data.csv")[,-1]
kable(head(dt))
country region year income Life_Expectancy Population_size
Afghanistan Asia 1800 603 28.2 3280000
Albania Europe 1800 667 35.4 410000
Algeria Africa 1800 715 28.8 2500000
Angola Africa 1800 618 27.0 1570000
Antigua and Barbuda Americas 1800 757 33.5 37000
Argentina Americas 1800 1510 33.2 534000

2 Plot of Life Expectancy and Income for 2015

A subset of the data containing only data for the year 2015 was created and called dt2015. The data contains 6 variables (country, region, year, income, life expectancy and population size) and 187 observations.

dt2015 <- filter(dt, year == 2015)
kable(head(dt2015))
country region year income Life_Expectancy Population_size
Afghanistan Asia 2015 1750 57.9 33700000
Albania Europe 2015 11000 77.6 2920000
Algeria Africa 2015 13700 77.3 39900000
Andorra Europe 2015 46600 82.5 78000
Angola Africa 2015 6230 64.0 27900000
Antigua and Barbuda Americas 2015 20100 77.2 99900

2.1 Scatter Plot Showing Income and Life Expectancy

myPlotlyLayout <- function(n){  
                              
  layout(n,  
      ### Title 
      title =list(text = "Association Between Income and Life Expectancy", 
                          font = list(family = "Times New Roman",  # HTML font family  
                                        size = 18,
                                       color = "#009E73")), 
      ### legend
      legend = list(title = list(text = 'Region',
                                 font = list(family = "Times New Roman",
                                               size = 18,
                                              color = "#009E73")),
                    bgcolor = "#e6ffff",
                    bordercolor = "navy",
                    groupclick = "togglegroup",  # one of  "toggleitem" AND "togglegroup".
                    orientation = "v"  # Sets the orientation of the legend.
                    
                    ),
    
      ## Background
      plot_bgcolor ='#e6ffff', 
      ## Axes labels
             xaxis = list(color = "#0072B2", 
                    title=list(text = 'Income',
                               font = list(family = 'Times New Roman', size=18)),
                    zeroline = TRUE,
                    zerolinecolor = '#ccffff', 
                    zerolinewidth = 0.5,
                    showgrid = TRUE,
                    gridcolor = '#e6f2ff'), 
            yaxis = list(color = "#0072B2", 
                    title=list(text = 'Life Expectancy',
                               font = list(family = 'Times New Roman', size=18)),
                    zeroline = TRUE,
                    zerolinecolor = '#ccffff', 
                    zerolinewidth = 0.5, 
                    showgrid = TRUE,
                    gridcolor = '#ccffff'),
       ## annotations
       annotations = list(  
                     x = 0.7,   # between 0 and 1. 0 = left, 1 = right
                     y = 0.3,   # between 0 and 1, 0 = bottom, 1 = top
                  font = list(size = 12,
                    color = "#D55E00"),   
                  text = "The point size is proportional to the Population Size",   
                  xref = "paper",  # "container" spans the entire `width` of the plot. 
                                   # "paper" refers to the width of the plotting area only.  
                  yref = "paper",  #  same as xref
               xanchor = "center", #  horizontal alignment with respect to its x position
               yanchor = "bottom", #  similar to xanchor  
             showarrow = FALSE  
           )
  )
       }
# standardize population size between 0 and 1
pop.size <- dt2015$Population_size
# sizes <- (pop.size - min(pop.size))/(max(pop.size) - min(pop.size))
# rel.pop = pop.size/1000000

plot_ly(
    data = dt2015,
    x = ~income,         # Horizontal axis 
    y = ~Life_Expectancy,
    color = ~factor(region), # must be a numeric factor
    colors=c("#D55E00", "#CC79A7", "#F0E442", "#0072B2", "#009E73"),
     text = ~paste("Country: ", country,
                   "<br>Population Size: ", Population_size),
   
     hovertemplate = paste('<i><b>Life Expectancy<b></i>: %{y}',
                           '<br><b>Income</b>:  %{x}',
                           '<br><b>%{text}</b>'),
    alpha  = 0.5,
   size = ~(3*log(pop.size)-11)^3,
   type = 'scatter',
    mode = 'markers',
   marker = list(opacity = 0.7, sizemode = "area", sizeref = 0.3),
 #  width = 700,
 #    height = 500
 width = 800,
    height = 500
     )  %>% myPlotlyLayout()

2.2 Plot Interpretation

This is a scatterplot of income and life expectancy for 187 countries in the world for the year 2015. The points on the plot are colored based on their regions (Africa, Americas, Asia, Europe and Oceania). The point sizes are proportional to the population size of each country. There appears to be a curvilinear relationship between income and life expectancy. The first part is linear and then gradually it becomes curved.

Countries in Africa and few in Asia have the lowest income and the shortest life expectancy while European and American countries have the highest income and longest life expectancy. Also, Asian countries with the largest population have their life expectancy between 60 and 70 years. The plot also shows differences in the life expectancy of many countries that have the same income such as countries in Africa, and parts of Asia and Oceania. Overall, the plot shows that life expectancy increases with higher income and decreases with lower income.

This plot shows the huge gap in life expectancy between countries with low income and countries with high income. This difference may be due to increased access to healthcare, education, good food and water for people living in countries with high income than people living in low income areas. From the plot, Japan had the highest life expectancy 83.8years with an average income of 37,800 and a population of 128,000,000. This was followed closely by Singapore with life expectancy of 83.6years, an average income of 80,900 and a population of 5,540,000.

Central African Republic and Lesotho had the lowest life expectancy of 49.7years and 49.6 years respectively, and both are countries in the African region.

3 Plot of Life Expectancy and Income Over Years

This is a plot showing changes in life expectancy and income from 1800 to 2018 for countries in Africa, America, Asia, Europe and Oceania.

# standardize population size between 0 and 1
pop.size <- dt$Population_size
# sizes <- (pop.size - min(pop.size))/(max(pop.size) - min(pop.size))
# rel.pop = pop.size/1000000

plot_ly(
    data = dt,
    x = ~income,         # Horizontal axis 
    y = ~Life_Expectancy,
    color = ~factor(region), # must be a numeric factor
    colors=c("#D55E00", "#CC79A7", "#F0E442", "#0072B2", "#009E73"),
    
    frame = ~year,
     text = ~paste("Country: ", country,
                   "<br>Population Size: ", Population_size),
   
     hovertemplate = paste('<i><b>Life Expectancy<b></i>: %{y}',
                           '<br><b>Income</b>:  %{x}',
                           '<br><b>%{text}</b>'),
    alpha  = 0.5,
   size = ~(3*log(pop.size)-11)^3,
   type = 'scatter',
    mode = 'markers',
    marker = list(opacity = 0.7, sizemode = "area", sizeref = 0.3),
 #  width = 700,
 #    height = 500
 width = 800,
    height = 500
     )  %>% myPlotlyLayout()

3.1 Plot Interpretation

From the plot, the average life expectancy globally was low in the early years and has since increased over time. In 1800, the average life expectancy for most of the countries lay between 20 and 40 years with an average annual income between 300 and 5000. Over the years, there has been a gradual increase in both income and life expectancy with the highest average life expectancy seen in Japan at 84.2years in 2018 with an income of about 39,100.

LS0tDQp0aXRsZTogIkRhdGEgQW5hbHlzaXMgVXNpbmcgSW50ZXJhY3RpdmUgUGxvdHMgaW4gUiINCmF1dGhvcjogIkVjaGVmdSBDaGlud2VuZHUiDQpkYXRlOiAiMjAyNC0wMy0wNiINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIGZpZ193aWR0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRvY19jb2xsYXBzZWQ6IHllcw0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIHNtb290aF9zY3JvbGw6IHRydWUNCiAgICB0aGVtZTogcmVhZGFibGUNCiAgICBmaWdfaGVpZ2h0OiA0DQogIHBkZl9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICBmaWdfd2lkdGg6IDMNCiAgICBmaWdfaGVpZ2h0OiAzDQogIHdvcmRfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIGtlZXBfbWQ6IHllcw0KZWRpdG9yX29wdGlvbnM6IA0KICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lDQotLS0NCg0KYGBgez1odG1sfQ0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCg0KLyogVGFibGUgb2YgY29udGVudCAtIG5hdmlnYXRpb24gKi8NCmRpdiNUT0MgbGkgew0KICAgIGxpc3Qtc3R5bGU6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLWNvbG9yOmxpZ2h0Z3JheTsNCiAgICBiYWNrZ3JvdW5kLWltYWdlOm5vbmU7DQogICAgYmFja2dyb3VuZC1yZXBlYXQ6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOjA7DQogICAgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7DQogICAgY29sb3I6ICM3ODBjMGM7DQp9DQoNCg0KLyogVGl0bGUgZm9udHMgKi8NCmgxLnRpdGxlIHsNCiAgZm9udC1zaXplOiAyNHB4Ow0KICBjb2xvcjogZGFya2JsdWU7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCiAgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7DQogIGZvbnQtdmFyaWFudC1jYXBzOiBub3JtYWw7DQp9DQpoNC5hdXRob3IgeyANCiAgZm9udC1zaXplOiAxOHB4Ow0KICBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsNCiAgY29sb3I6IG5hdnk7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCmg0LmRhdGUgeyANCiAgZm9udC1zaXplOiAxOHB4Ow0KICBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsNCiAgY29sb3I6IGRhcmtibHVlOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCi8qIFNlY3Rpb24gaGVhZGVycyAqLw0KaDEgew0KICAgIGZvbnQtc2l6ZTogMjJweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoMiB7DQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmgzIHsgDQogICAgZm9udC1zaXplOiAxNXB4Ow0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmg0IHsNCiAgICBmb250LXNpemU6IDE4cHg7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IGRhcmtyZWQ7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KLyogRGVjb3JhdGlvbiBvZiBoeXBlcmxpbmtzICAqLw0KDQovKiB1bnZpc2l0ZWQgbGluayAqLw0KYTpsaW5rIHsNCiAgY29sb3I6IGdyZWVuOw0KfQ0KDQovKiB2aXNpdGVkIGxpbmsgKi8NCmE6dmlzaXRlZCB7DQogIGNvbG9yOiBwdXJwbGU7DQp9DQoNCi8qIG1vdXNlIG92ZXIgbGluayAqLw0KYTpob3ZlciB7DQogIGNvbG9yOiByZWQ7DQp9DQoNCi8qIHNlbGVjdGVkIGxpbmsgKi8NCmE6YWN0aXZlIHsNCiAgY29sb3I6IHllbGxvdzsNCn0NCjwvc3R5bGU+DQpgYGANCg0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCiMgY29kZSBjaHVuayBzcGVjaWZpZXMgd2hldGhlciB0aGUgUiBjb2RlLCB3YXJuaW5ncywgYW5kIG91dHB1dCANCiMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IGZpbGVzLg0Kb3B0aW9ucyhyZXBvcyA9IGxpc3QoQ1JBTj0iaHR0cDovL2NyYW4ucnN0dWRpby5jb20vIikpDQppZiAoIXJlcXVpcmUoInRpZHl2ZXJzZSIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJ0aWR5dmVyc2UiKQ0KICAgbGlicmFyeSh0aWR5dmVyc2UpDQp9DQppZiAoIXJlcXVpcmUoImtuaXRyIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImtuaXRyIikNCiAgIGxpYnJhcnkoa25pdHIpDQp9DQppZiAoIXJlcXVpcmUoImNvd3Bsb3QiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygiY293cGxvdCIpDQogICBsaWJyYXJ5KGNvd3Bsb3QpDQp9DQppZiAoIXJlcXVpcmUoImxhdGV4MmV4cCIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJsYXRleDJleHAiKQ0KICAgbGlicmFyeShsYXRleDJleHApDQp9DQppZiAoIXJlcXVpcmUoInBsb3RseSIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJwbG90bHkiKQ0KICAgbGlicmFyeShwbG90bHkpDQp9DQppZiAoIXJlcXVpcmUoImdhcG1pbmRlciIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJnYXBtaW5kZXIiKQ0KICAgbGlicmFyeShnYXBtaW5kZXIpDQp9DQppZiAoIXJlcXVpcmUoInBuZyIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygicG5nIikgICAgICAgICAgICAgIyBJbnN0YWxsIHBuZyBwYWNrYWdlDQogICAgbGlicmFyeSgicG5nIikNCn0NCmlmICghcmVxdWlyZSgiUkN1cmwiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoIlJDdXJsIikgICAgICAgICAgICAgIyBJbnN0YWxsIFJDdXJsIHBhY2thZ2UNCiAgICBsaWJyYXJ5KCJSQ3VybCIpDQp9DQppZiAoIXJlcXVpcmUoImNvbG91cnBpY2tlciIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiY29sb3VycGlja2VyIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImNvbG91cnBpY2tlciIpDQp9DQppZiAoIXJlcXVpcmUoImdnYW5pbWF0ZSIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiZ2dhbmltYXRlIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImdnYW5pbWF0ZSIpDQp9DQppZiAoIXJlcXVpcmUoImdpZnNraSIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiZ2lmc2tpIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImdpZnNraSIpDQp9DQppZiAoIXJlcXVpcmUoIm1hZ2ljayIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygibWFnaWNrIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoIm1hZ2ljayIpDQp9DQppZiAoIXJlcXVpcmUoImdyRGV2aWNlcyIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiZ3JEZXZpY2VzIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImdyRGV2aWNlcyIpDQp9DQppZiAoIXJlcXVpcmUoImpwZWciKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoImpwZWciKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgianBlZyIpDQp9DQppZiAoIXJlcXVpcmUoIlZHQU0iKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoIlZHQU0iKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgiVkdBTSIpDQp9DQppZiAoIXJlcXVpcmUoIk1BU1MiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoIk1BU1MiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgiTUFTUyIpDQp9DQppZiAoIXJlcXVpcmUoIm5uZXQiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoIm5uZXQiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgibm5ldCIpDQp9DQppZiAoIXJlcXVpcmUoImNsdXN0ZXIiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoImNsdXN0ZXIiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgiY2x1c3RlciIpDQp9DQppZiAoIXJlcXVpcmUoInN0cmluZ3IiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygic3RyaW5nciIsIGRlcGVuZGVuY2llcyA9IFRSVUUpDQogICBsaWJyYXJ5KHN0cmluZ3IpDQp9DQoNCmlmICghcmVxdWlyZSgidG0iKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygidG0iLCBkZXBlbmRlbmNpZXMgPSBUUlVFKQ0KICAgbGlicmFyeSh0bSkNCn0NCg0KaWYgKCFyZXF1aXJlKCJ3b3JkY2xvdWQiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygid29yZGNsb3VkIiwgZGVwZW5kZW5jaWVzID0gVFJVRSkNCiAgIGxpYnJhcnkod29yZGNsb3VkKQ0KfQ0KDQppZiAoIXJlcXVpcmUoIlJDdXJsIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoIlJDdXJsIiwgZGVwZW5kZW5jaWVzID0gVFJVRSkNCiAgIGxpYnJhcnkoUkN1cmwpDQp9DQoNCmlmICghcmVxdWlyZSgiWE1MIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoIlhNTCIsIGRlcGVuZGVuY2llcyA9IFRSVUUpDQogICBsaWJyYXJ5KFhNTCkNCn0NCmlmICghcmVxdWlyZSgiU25vd2JhbGxDIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoIlNub3diYWxsQyIsIGRlcGVuZGVuY2llcyA9IFRSVUUpDQogICBsaWJyYXJ5KFNub3diYWxsQykNCn0NCmlmICghcmVxdWlyZSgiUkNvbG9yQnJld2VyIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoIlJDb2xvckJyZXdlciIsIGRlcGVuZGVuY2llcyA9IFRSVUUpDQogICBsaWJyYXJ5KFJDb2xvckJyZXdlcikNCn0NCmlmICghcmVxdWlyZSgiZ2dwbG90MiIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJnZ3Bsb3QyIikNCn0NCmlmICghcmVxdWlyZSgiZ2dhbmltYXRlIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJnZ2FuaW1hdGUiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgiZ2dhbmltYXRlIikNCn0NCmlmICghcmVxdWlyZSgiZ3JhcGhpY3MiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoImdyYXBoaWNzIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImdyYXBoaWNzIikNCn0NCmlmICghcmVxdWlyZSgiZ2dyaWRnZXMiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoImdncmlkZ2VzIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImdncmlkZ2VzIikNCn0NCmlmICghcmVxdWlyZSgicGx5ciIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygicGx5ciIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJwbHlyIikNCn0NCmlmICghcmVxdWlyZSgiZ2dpcmFwaCIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiZ2dpcmFwaCIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJnZ2lyYXBoIikNCn0NCmlmICghcmVxdWlyZSgiaGlnaGNoYXJ0ZXIiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoImhpZ2hjaGFydGVyIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImhpZ2hjaGFydGVyIikNCn0NCmlmICghcmVxdWlyZSgiZm9yZWNhc3QiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoImZvcmVjYXN0IikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImZvcmVjYXN0IikNCn0NCg0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nID0gRkFMU0UsICAgDQogICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVFJVRSwgICANCiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgY29tbWVudCA9IE5BKQ0KYGBgDQoNCiMgSW50cm9kdWN0aW9uDQpGb3VyIGRhdGFzZXRzIGZyb20gdGhlIFdvcmxkIExpZmUgRXhwZWN0YW5jeSBkYXRhIC0gSW5jb21lIHBlciBQZXJzb24sIExpZmUgRXhwZWN0YW5jeSwgUG9wdWxhdGlvbiBTaXplIGFuZCBDb3VudHJ5IFJlZ2lvbnMsIGNvbnRhaW4gaW5mb3JtYXRpb24gdGhhdCBwb3RlbnRpYWxseSBpbXBhY3RzIHRoZSBsaWZlIGV4cGVjdGFuY3kgb2YgdGhlIHdvcmxkLiBUaGUgZGF0YSBjb3ZlcnMgcmVsYXRpdmUgaW5mb3JtYXRpb24gYmV0d2VlbiAxODAwIGFuZCAyMDE4LiBBbGwgZm91ciBkYXRhc2V0cyB3ZXJlIGNvbWJpbmVkIHRvZ2V0aGVyIGludG8gb25lIGRhdGFzZXQgZm9yIHRoaXMgYW5hbHlzaXMuDQoNClRoZSBjb21iaW5lZCBkYXRhc2V0IGNvbnRhaW5zIDQwNDM3IG9ic2VydmF0aW9ucyBhbmQgNiB2YXJpYWJsZXMuIFRoZSB2YXJpYWJsZXMgYXJlOg0KDQoxLiBgY291bnRyeWAgLSBOYW1lIG9mIHRoZSBjb3VudHJ5IChjYXRlZ29yaWNhbCkNCjIuIGBSZWdpb25gICAtIFRoZSByZWdpb24gdGhlIGNvdW50cnkgYmVsb25ncyB0byAoY2F0ZWdvcmljYWwpDQozLiBgWWVhcmAgICAgLSBZZWFyIChjYXRlZ29yaWNhbCkNCjQuIGBJbmNvbWVgICAtIEluY29tZSAoTnVtZXJpY2FsKSAtIGluIGNvbnN0YW50IGludGVybmF0aW9uYWwgZG9sbGFycy4NCjUuIGBsaWZlIGV4cGVjdGFuY3lgIC0gTnVtYmVyIG9mIHllYXJzIChOdW1lcmljYWwpDQo2LiBgUG9wdWxhdGlvbiBTaXplYCAtIFRvdGFsIFBvcHVsYXRpb24gY291bnQgb2YgYSBjb3VudHJ5IChOdW1lcmljYWwpDQoNCkEgY29weSBvZiB0aGUgY29tYmluZWQgZGF0YXNldCBjYW4gYmUgZm91bmQgaGVyZTogaHR0cHM6Ly9naXRodWIuY29tL2NoaW53ZXgvU1RBNTUzL3Jhdy9tYWluL3cwNS9tZXJnZWRfZGF0YS5jc3YNCg0KYGBge3J9DQpkdCA8LSByZWFkLmNzdihmaWxlPSJodHRwczovL2dpdGh1Yi5jb20vY2hpbndleC9TVEE1NTMvcmF3L21haW4vdzA1L21lcmdlZF9kYXRhLmNzdiIpWywtMV0NCmthYmxlKGhlYWQoZHQpKQ0KYGBgDQoNCg0KIyBQbG90IG9mIExpZmUgRXhwZWN0YW5jeSBhbmQgSW5jb21lIGZvciAyMDE1DQpBIHN1YnNldCBvZiB0aGUgZGF0YSBjb250YWluaW5nIG9ubHkgZGF0YSBmb3IgdGhlIHllYXIgMjAxNSB3YXMgY3JlYXRlZCBhbmQgY2FsbGVkIGBkdDIwMTVgLg0KVGhlIGRhdGEgY29udGFpbnMgNiB2YXJpYWJsZXMgKGNvdW50cnksIHJlZ2lvbiwgeWVhciwgaW5jb21lLCBsaWZlIGV4cGVjdGFuY3kgYW5kIHBvcHVsYXRpb24gc2l6ZSkgYW5kIDE4NyBvYnNlcnZhdGlvbnMuDQoNCmBgYHtyfQ0KZHQyMDE1IDwtIGZpbHRlcihkdCwgeWVhciA9PSAyMDE1KQ0Ka2FibGUoaGVhZChkdDIwMTUpKQ0KYGBgDQoNCiMjIFNjYXR0ZXIgUGxvdCBTaG93aW5nIEluY29tZSBhbmQgTGlmZSBFeHBlY3RhbmN5DQpgYGB7ciBmaWcuYWxpZ249J2NlbnRlcicsIGZpZy53aWR0aD03LCBmaWcuaGVpZ2h0PTUsIGZpZy5jYXAgPSAiU2NhdHRlciBQbG90IFNob3dpbmcgSW5jb21lIGFuZCBMaWZlIEV4cGVjdGFuY3kifQ0KbXlQbG90bHlMYXlvdXQgPC0gZnVuY3Rpb24obil7ICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBsYXlvdXQobiwgIA0KICAgICAgIyMjIFRpdGxlIA0KICAgICAgdGl0bGUgPWxpc3QodGV4dCA9ICJBc3NvY2lhdGlvbiBCZXR3ZWVuIEluY29tZSBhbmQgTGlmZSBFeHBlY3RhbmN5IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGZhbWlseSA9ICJUaW1lcyBOZXcgUm9tYW4iLCAgIyBIVE1MIGZvbnQgZmFtaWx5ICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMTgsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICIjMDA5RTczIikpLCANCiAgICAgICMjIyBsZWdlbmQNCiAgICAgIGxlZ2VuZCA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAnUmVnaW9uJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGZhbWlseSA9ICJUaW1lcyBOZXcgUm9tYW4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMTgsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAiIzAwOUU3MyIpKSwNCiAgICAgICAgICAgICAgICAgICAgYmdjb2xvciA9ICIjZTZmZmZmIiwNCiAgICAgICAgICAgICAgICAgICAgYm9yZGVyY29sb3IgPSAibmF2eSIsDQogICAgICAgICAgICAgICAgICAgIGdyb3VwY2xpY2sgPSAidG9nZ2xlZ3JvdXAiLCAgIyBvbmUgb2YgICJ0b2dnbGVpdGVtIiBBTkQgInRvZ2dsZWdyb3VwIi4NCiAgICAgICAgICAgICAgICAgICAgb3JpZW50YXRpb24gPSAidiIgICMgU2V0cyB0aGUgb3JpZW50YXRpb24gb2YgdGhlIGxlZ2VuZC4NCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICksDQogICAgDQogICAgICAjIyBCYWNrZ3JvdW5kDQogICAgICBwbG90X2JnY29sb3IgPScjZTZmZmZmJywgDQogICAgICAjIyBBeGVzIGxhYmVscw0KICAgICAgICAgICAgIHhheGlzID0gbGlzdChjb2xvciA9ICIjMDA3MkIyIiwgDQogICAgICAgICAgICAgICAgICAgIHRpdGxlPWxpc3QodGV4dCA9ICdJbmNvbWUnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGZhbWlseSA9ICdUaW1lcyBOZXcgUm9tYW4nLCBzaXplPTE4KSksDQogICAgICAgICAgICAgICAgICAgIHplcm9saW5lID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgemVyb2xpbmVjb2xvciA9ICcjY2NmZmZmJywgDQogICAgICAgICAgICAgICAgICAgIHplcm9saW5ld2lkdGggPSAwLjUsDQogICAgICAgICAgICAgICAgICAgIHNob3dncmlkID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgZ3JpZGNvbG9yID0gJyNlNmYyZmYnKSwgDQogICAgICAgICAgICB5YXhpcyA9IGxpc3QoY29sb3IgPSAiIzAwNzJCMiIsIA0KICAgICAgICAgICAgICAgICAgICB0aXRsZT1saXN0KHRleHQgPSAnTGlmZSBFeHBlY3RhbmN5JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250ID0gbGlzdChmYW1pbHkgPSAnVGltZXMgTmV3IFJvbWFuJywgc2l6ZT0xOCkpLA0KICAgICAgICAgICAgICAgICAgICB6ZXJvbGluZSA9IFRSVUUsDQogICAgICAgICAgICAgICAgICAgIHplcm9saW5lY29sb3IgPSAnI2NjZmZmZicsIA0KICAgICAgICAgICAgICAgICAgICB6ZXJvbGluZXdpZHRoID0gMC41LCANCiAgICAgICAgICAgICAgICAgICAgc2hvd2dyaWQgPSBUUlVFLA0KICAgICAgICAgICAgICAgICAgICBncmlkY29sb3IgPSAnI2NjZmZmZicpLA0KICAgICAgICMjIGFubm90YXRpb25zDQogICAgICAgYW5ub3RhdGlvbnMgPSBsaXN0KCAgDQogICAgICAgICAgICAgICAgICAgICB4ID0gMC43LCAgICMgYmV0d2VlbiAwIGFuZCAxLiAwID0gbGVmdCwgMSA9IHJpZ2h0DQogICAgICAgICAgICAgICAgICAgICB5ID0gMC4zLCAgICMgYmV0d2VlbiAwIGFuZCAxLCAwID0gYm90dG9tLCAxID0gdG9wDQogICAgICAgICAgICAgICAgICBmb250ID0gbGlzdChzaXplID0gMTIsDQogICAgICAgICAgICAgICAgICAgIGNvbG9yID0gIiNENTVFMDAiKSwgICANCiAgICAgICAgICAgICAgICAgIHRleHQgPSAiVGhlIHBvaW50IHNpemUgaXMgcHJvcG9ydGlvbmFsIHRvIHRoZSBQb3B1bGF0aW9uIFNpemUiLCAgIA0KICAgICAgICAgICAgICAgICAgeHJlZiA9ICJwYXBlciIsICAjICJjb250YWluZXIiIHNwYW5zIHRoZSBlbnRpcmUgYHdpZHRoYCBvZiB0aGUgcGxvdC4gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgInBhcGVyIiByZWZlcnMgdG8gdGhlIHdpZHRoIG9mIHRoZSBwbG90dGluZyBhcmVhIG9ubHkuICANCiAgICAgICAgICAgICAgICAgIHlyZWYgPSAicGFwZXIiLCAgIyAgc2FtZSBhcyB4cmVmDQogICAgICAgICAgICAgICB4YW5jaG9yID0gImNlbnRlciIsICMgIGhvcml6b250YWwgYWxpZ25tZW50IHdpdGggcmVzcGVjdCB0byBpdHMgeCBwb3NpdGlvbg0KICAgICAgICAgICAgICAgeWFuY2hvciA9ICJib3R0b20iLCAjICBzaW1pbGFyIHRvIHhhbmNob3IgIA0KICAgICAgICAgICAgIHNob3dhcnJvdyA9IEZBTFNFICANCiAgICAgICAgICAgKQ0KICApDQogICAgICAgfQ0KYGBgDQoNCg0KDQoNCg0KYGBge3J9DQojIHN0YW5kYXJkaXplIHBvcHVsYXRpb24gc2l6ZSBiZXR3ZWVuIDAgYW5kIDENCnBvcC5zaXplIDwtIGR0MjAxNSRQb3B1bGF0aW9uX3NpemUNCiMgc2l6ZXMgPC0gKHBvcC5zaXplIC0gbWluKHBvcC5zaXplKSkvKG1heChwb3Auc2l6ZSkgLSBtaW4ocG9wLnNpemUpKQ0KIyByZWwucG9wID0gcG9wLnNpemUvMTAwMDAwMA0KDQpwbG90X2x5KA0KICAgIGRhdGEgPSBkdDIwMTUsDQogICAgeCA9IH5pbmNvbWUsICAgICAgICAgIyBIb3Jpem9udGFsIGF4aXMgDQogICAgeSA9IH5MaWZlX0V4cGVjdGFuY3ksDQogICAgY29sb3IgPSB+ZmFjdG9yKHJlZ2lvbiksICMgbXVzdCBiZSBhIG51bWVyaWMgZmFjdG9yDQogICAgY29sb3JzPWMoIiNENTVFMDAiLCAiI0NDNzlBNyIsICIjRjBFNDQyIiwgIiMwMDcyQjIiLCAiIzAwOUU3MyIpLA0KICAgICB0ZXh0ID0gfnBhc3RlKCJDb3VudHJ5OiAiLCBjb3VudHJ5LA0KICAgICAgICAgICAgICAgICAgICI8YnI+UG9wdWxhdGlvbiBTaXplOiAiLCBQb3B1bGF0aW9uX3NpemUpLA0KICAgDQogICAgIGhvdmVydGVtcGxhdGUgPSBwYXN0ZSgnPGk+PGI+TGlmZSBFeHBlY3RhbmN5PGI+PC9pPjogJXt5fScsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAnPGJyPjxiPkluY29tZTwvYj46ICAle3h9JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICc8YnI+PGI+JXt0ZXh0fTwvYj4nKSwNCiAgICBhbHBoYSAgPSAwLjUsDQogICBzaXplID0gfigzKmxvZyhwb3Auc2l6ZSktMTEpXjMsDQogICB0eXBlID0gJ3NjYXR0ZXInLA0KICAgIG1vZGUgPSAnbWFya2VycycsDQogICBtYXJrZXIgPSBsaXN0KG9wYWNpdHkgPSAwLjcsIHNpemVtb2RlID0gImFyZWEiLCBzaXplcmVmID0gMC4zKSwNCiAjICB3aWR0aCA9IDcwMCwNCiAjICAgIGhlaWdodCA9IDUwMA0KIHdpZHRoID0gODAwLA0KICAgIGhlaWdodCA9IDUwMA0KICAgICApICAlPiUgbXlQbG90bHlMYXlvdXQoKQ0KYGBgDQoNCiMjIFBsb3QgSW50ZXJwcmV0YXRpb24NClRoaXMgaXMgYSBzY2F0dGVycGxvdCBvZiBpbmNvbWUgYW5kIGxpZmUgZXhwZWN0YW5jeSBmb3IgMTg3IGNvdW50cmllcyBpbiB0aGUgd29ybGQgZm9yIHRoZSB5ZWFyIDIwMTUuIFRoZSBwb2ludHMgb24gdGhlIHBsb3QgYXJlIGNvbG9yZWQgYmFzZWQgb24gdGhlaXIgcmVnaW9ucyAoQWZyaWNhLCBBbWVyaWNhcywgQXNpYSwgRXVyb3BlIGFuZCBPY2VhbmlhKS4gVGhlIHBvaW50IHNpemVzIGFyZSBwcm9wb3J0aW9uYWwgdG8gdGhlIHBvcHVsYXRpb24gc2l6ZSBvZiBlYWNoIGNvdW50cnkuIFRoZXJlIGFwcGVhcnMgdG8gYmUgYSBjdXJ2aWxpbmVhciByZWxhdGlvbnNoaXAgYmV0d2VlbiBpbmNvbWUgYW5kIGxpZmUgZXhwZWN0YW5jeS4gVGhlIGZpcnN0IHBhcnQgaXMgbGluZWFyIGFuZCB0aGVuIGdyYWR1YWxseSBpdCBiZWNvbWVzIGN1cnZlZC4NCg0KQ291bnRyaWVzIGluIEFmcmljYSBhbmQgZmV3IGluIEFzaWEgaGF2ZSB0aGUgbG93ZXN0IGluY29tZSBhbmQgdGhlIHNob3J0ZXN0IGxpZmUgZXhwZWN0YW5jeSB3aGlsZSBFdXJvcGVhbiBhbmQgQW1lcmljYW4gY291bnRyaWVzIGhhdmUgdGhlIGhpZ2hlc3QgaW5jb21lIGFuZCBsb25nZXN0IGxpZmUgZXhwZWN0YW5jeS4gQWxzbywgQXNpYW4gY291bnRyaWVzIHdpdGggdGhlIGxhcmdlc3QgcG9wdWxhdGlvbiBoYXZlIHRoZWlyIGxpZmUgZXhwZWN0YW5jeSBiZXR3ZWVuIDYwIGFuZCA3MCB5ZWFycy4gVGhlIHBsb3QgYWxzbyBzaG93cyBkaWZmZXJlbmNlcyBpbiB0aGUgbGlmZSBleHBlY3RhbmN5IG9mIG1hbnkgY291bnRyaWVzIHRoYXQgaGF2ZSB0aGUgc2FtZSBpbmNvbWUgc3VjaCBhcyBjb3VudHJpZXMgaW4gQWZyaWNhLCBhbmQgcGFydHMgb2YgQXNpYSBhbmQgT2NlYW5pYS4gT3ZlcmFsbCwgdGhlIHBsb3Qgc2hvd3MgdGhhdCBsaWZlIGV4cGVjdGFuY3kgaW5jcmVhc2VzIHdpdGggaGlnaGVyIGluY29tZSBhbmQgZGVjcmVhc2VzIHdpdGggbG93ZXIgaW5jb21lLg0KDQpUaGlzIHBsb3Qgc2hvd3MgdGhlIGh1Z2UgZ2FwIGluIGxpZmUgZXhwZWN0YW5jeSBiZXR3ZWVuIGNvdW50cmllcyB3aXRoIGxvdyBpbmNvbWUgYW5kIGNvdW50cmllcyB3aXRoIGhpZ2ggaW5jb21lLiBUaGlzIGRpZmZlcmVuY2UgbWF5IGJlIGR1ZSB0byBpbmNyZWFzZWQgYWNjZXNzIHRvIGhlYWx0aGNhcmUsIGVkdWNhdGlvbiwgZ29vZCBmb29kIGFuZCB3YXRlciBmb3IgcGVvcGxlIGxpdmluZyBpbiBjb3VudHJpZXMgd2l0aCBoaWdoIGluY29tZSB0aGFuIHBlb3BsZSBsaXZpbmcgaW4gbG93IGluY29tZSBhcmVhcy4gRnJvbSB0aGUgcGxvdCwgSmFwYW4gaGFkIHRoZSBoaWdoZXN0IGxpZmUgZXhwZWN0YW5jeSA4My44eWVhcnMgd2l0aCBhbiBhdmVyYWdlIGluY29tZSBvZiAzNyw4MDAgYW5kIGEgcG9wdWxhdGlvbiBvZiAxMjgsMDAwLDAwMC4gVGhpcyB3YXMgZm9sbG93ZWQgY2xvc2VseSBieSBTaW5nYXBvcmUgd2l0aCBsaWZlIGV4cGVjdGFuY3kgb2YgODMuNnllYXJzLCBhbiBhdmVyYWdlIGluY29tZSBvZiA4MCw5MDAgYW5kIGEgcG9wdWxhdGlvbiBvZiA1LDU0MCwwMDAuDQoNCkNlbnRyYWwgQWZyaWNhbiBSZXB1YmxpYyBhbmQgTGVzb3RobyBoYWQgdGhlIGxvd2VzdCBsaWZlIGV4cGVjdGFuY3kgb2YgNDkuN3llYXJzIGFuZCA0OS42IHllYXJzIHJlc3BlY3RpdmVseSwgYW5kIGJvdGggYXJlIGNvdW50cmllcyBpbiB0aGUgQWZyaWNhbiByZWdpb24uDQoNCiMgUGxvdCBvZiBMaWZlIEV4cGVjdGFuY3kgYW5kIEluY29tZSBPdmVyIFllYXJzDQpUaGlzIGlzIGEgcGxvdCBzaG93aW5nIGNoYW5nZXMgaW4gbGlmZSBleHBlY3RhbmN5IGFuZCBpbmNvbWUgZnJvbSAxODAwIHRvIDIwMTggZm9yIGNvdW50cmllcyBpbiBBZnJpY2EsIEFtZXJpY2EsIEFzaWEsIEV1cm9wZSBhbmQgT2NlYW5pYS4NCg0KYGBge3J9DQojIHN0YW5kYXJkaXplIHBvcHVsYXRpb24gc2l6ZSBiZXR3ZWVuIDAgYW5kIDENCnBvcC5zaXplIDwtIGR0JFBvcHVsYXRpb25fc2l6ZQ0KIyBzaXplcyA8LSAocG9wLnNpemUgLSBtaW4ocG9wLnNpemUpKS8obWF4KHBvcC5zaXplKSAtIG1pbihwb3Auc2l6ZSkpDQojIHJlbC5wb3AgPSBwb3Auc2l6ZS8xMDAwMDAwDQoNCnBsb3RfbHkoDQogICAgZGF0YSA9IGR0LA0KICAgIHggPSB+aW5jb21lLCAgICAgICAgICMgSG9yaXpvbnRhbCBheGlzIA0KICAgIHkgPSB+TGlmZV9FeHBlY3RhbmN5LA0KICAgIGNvbG9yID0gfmZhY3RvcihyZWdpb24pLCAjIG11c3QgYmUgYSBudW1lcmljIGZhY3Rvcg0KICAgIGNvbG9ycz1jKCIjRDU1RTAwIiwgIiNDQzc5QTciLCAiI0YwRTQ0MiIsICIjMDA3MkIyIiwgIiMwMDlFNzMiKSwNCiAgICANCiAgICBmcmFtZSA9IH55ZWFyLA0KICAgICB0ZXh0ID0gfnBhc3RlKCJDb3VudHJ5OiAiLCBjb3VudHJ5LA0KICAgICAgICAgICAgICAgICAgICI8YnI+UG9wdWxhdGlvbiBTaXplOiAiLCBQb3B1bGF0aW9uX3NpemUpLA0KICAgDQogICAgIGhvdmVydGVtcGxhdGUgPSBwYXN0ZSgnPGk+PGI+TGlmZSBFeHBlY3RhbmN5PGI+PC9pPjogJXt5fScsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAnPGJyPjxiPkluY29tZTwvYj46ICAle3h9JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICc8YnI+PGI+JXt0ZXh0fTwvYj4nKSwNCiAgICBhbHBoYSAgPSAwLjUsDQogICBzaXplID0gfigzKmxvZyhwb3Auc2l6ZSktMTEpXjMsDQogICB0eXBlID0gJ3NjYXR0ZXInLA0KICAgIG1vZGUgPSAnbWFya2VycycsDQogICAgbWFya2VyID0gbGlzdChvcGFjaXR5ID0gMC43LCBzaXplbW9kZSA9ICJhcmVhIiwgc2l6ZXJlZiA9IDAuMyksDQogIyAgd2lkdGggPSA3MDAsDQogIyAgICBoZWlnaHQgPSA1MDANCiB3aWR0aCA9IDgwMCwNCiAgICBoZWlnaHQgPSA1MDANCiAgICAgKSAgJT4lIG15UGxvdGx5TGF5b3V0KCkNCmBgYA0KDQojIyBQbG90IEludGVycHJldGF0aW9uDQoNCkZyb20gdGhlIHBsb3QsIHRoZSBhdmVyYWdlIGxpZmUgZXhwZWN0YW5jeSBnbG9iYWxseSB3YXMgbG93IGluIHRoZSBlYXJseSB5ZWFycyBhbmQgaGFzIHNpbmNlIGluY3JlYXNlZCBvdmVyIHRpbWUuIEluIDE4MDAsIHRoZSBhdmVyYWdlIGxpZmUgZXhwZWN0YW5jeSBmb3IgbW9zdCBvZiB0aGUgY291bnRyaWVzIGxheSBiZXR3ZWVuIDIwIGFuZCA0MCB5ZWFycyB3aXRoIGFuIGF2ZXJhZ2UgYW5udWFsIGluY29tZSBiZXR3ZWVuIDMwMCBhbmQgNTAwMC4gT3ZlciB0aGUgeWVhcnMsIHRoZXJlIGhhcyBiZWVuIGEgZ3JhZHVhbCBpbmNyZWFzZSBpbiBib3RoIGluY29tZSBhbmQgbGlmZSBleHBlY3RhbmN5IHdpdGggdGhlIGhpZ2hlc3QgYXZlcmFnZSBsaWZlIGV4cGVjdGFuY3kgc2VlbiBpbiBKYXBhbiBhdCA4NC4yeWVhcnMgaW4gMjAxOCB3aXRoIGFuIGluY29tZSBvZiBhYm91dCAzOSwxMDAuDQoNCg==